/**
 * 
 */
package mm.front.jsf.mb;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import mm.back.DetalleVentaDTO;
import mm.back.entity.DetalleVenta;
import mm.back.service.VentasService;
import mm.exceptions.MMInvalidIDException;
import mm.front.jsf.ConstantesOutcome;
import mm.front.jsf.JSFUtils;

/**
 * @author PUSDERKIS
 *
 */
public class DetalleVentasManagedBean extends MMAbstractManagedBean {

	private List<DetalleVentaDTO> detalleVentas;
	
	private VentasService ventasService;

	private Long idVenta;
	
	private boolean userConfirmed;
	
	private boolean popupConfirmSaveVentaOpen;
	
	
	/**
	 * @param ventasService the ventasService to set
	 */
	public void setVentasService(VentasService ventasService) {
		this.ventasService = ventasService;
	}
	
	public String verDetalleVenta(Long idVenta){
		if (idVenta == null){
			throw new MMInvalidIDException("No se puede recuperar la venta número: "+idVenta);
		}
		setIdVenta(idVenta);
		try{
			List<DetalleVenta> dvList = ventasService.buscarDetalleVentas(idVenta);
			
			if (dvList != null){
				List<DetalleVentaDTO> lista = new ArrayList<DetalleVentaDTO>(dvList.size());
				DetalleVentaDTO tmp;
				
				for(DetalleVenta dv : dvList){
					tmp = new DetalleVentaDTO(idVenta, dv);
					lista.add(tmp);
				}
				setDetalleVentas(lista);
			}
		} catch (MMInvalidIDException mmiie) {
			FacesMessage fm = new FacesMessage("No se puede recuperar la venta número: "+idVenta);
			fm.setSeverity(FacesMessage.SEVERITY_INFO);
			FacesContext.getCurrentInstance().addMessage(null, fm);
			return null;
		}
		return ConstantesOutcome.VENTAS_DETALLE;
	}
	
	/**
	 * verifica si se puede guardar la venta o hay que pedir confirmación al usuario.
	 * @return
	 */
	private boolean canSaveVenta(){
		if (detalleVentas == null){
			return false;
		}
		
		if (isUserConfirmed()){
			return true;
		}
		
		for (DetalleVentaDTO dto : detalleVentas){
			if (BigDecimal.ZERO.compareTo(dto.getDevolucion()) > 0){
				return false;
			}
		}
		
		return true;
			
	}
	
	public String guardarVenta(){
		
		ventasService.registrarDevolucion(getIdVenta(), getDetalleVentas());
		
		JSFUtils.addInfoMessage("Se registro los cambios con exito.");
		
		return verDetalleVenta(getIdVenta());
	}
	
	

	/**
	 * @return the detalleVentas
	 */
	public List<DetalleVentaDTO> getDetalleVentas() {
		return detalleVentas;
	}

	/**
	 * @param detalleVentas the detalleVentas to set
	 */
	public void setDetalleVentas(List<DetalleVentaDTO> detalleVentas) {
		this.detalleVentas = detalleVentas;
	}

	/**
	 * @return the idVenta
	 */
	public Long getIdVenta() {
		return idVenta;
	}

	/**
	 * @param idVenta the idVenta to set
	 */
	public void setIdVenta(Long idVenta) {
		this.idVenta = idVenta;
	}

	/**
	 * @return the userConfirmed
	 */
	public boolean isUserConfirmed() {
		return userConfirmed;
	}

	/**
	 * @param userConfirmed the userConfirmed to set
	 */
	public void setUserConfirmed(boolean userConfirmed) {
		this.userConfirmed = userConfirmed;
	}

	/**
	 * @return the popupConfirmSaveVentaOpen
	 */
	public boolean isPopupConfirmSaveVentaOpen() {
		return popupConfirmSaveVentaOpen;
	}

	/**
	 * @param popupConfirmSaveVentaOpen the popupConfirmSaveVentaOpen to set
	 */
	public void setPopupConfirmSaveVentaOpen(boolean popupConfirmSaveVentaOpen) {
		this.popupConfirmSaveVentaOpen = popupConfirmSaveVentaOpen;
	}


}
